package day_2022_12_to_3.year2023;

/**
 * @author haomin
 * @date 2023/02/10 22:50
 **/
public class Day2_10_Num1223 {
    public class Solution {
        public int DieSimulator(int n, int[] rollMax) {
            int mod = 1000000007;
            int res = 0;
            int[][][] temp = new int[2][][];
            for(int i = 0;i<2;i++){//数组初始化，ijk表示投第i个骰子时数字为j（1<=j+1<=6）且数字j已连续出现k次的组合数
                temp[i]=new int[6][];
                for(int j = 0;j<6;j++){
                    temp[i][j] = new int[rollMax[j]+1];
                    if(i==1)temp[1][j][1]=1;
                }
            }
            for(int i = 2;i<=n;i++){
                for(int j = 0;j<6;j++){
                    for(int k = 1;k<=rollMax[j];k++){//将数据移位
                        temp[0][j][k]=temp[1][j][k];
                        temp[1][j][k]=0;
                    }
                }
                for(int j = 0;j<6;j++){//状态转移，对于不是同一个数字的，因为要切换数字，所以只能加到temp[1][j][1]上，而对于同一数字，则要判断是否小于rollmax[j]，如果小于，则说明可以继续连续投出该数字，则temp[1][j][k+1]=temp[0][j][k]
                    for(int k = 1;k<=rollMax[j];k++){
                        for(int l = 0;l<6;l++){
                            if(l!=j){
                                temp[1][l][1]=(temp[1][l][1]+temp[0][j][k])%mod;
                            }else if(k<rollMax[j]){
                                temp[1][j][k+1]=temp[0][j][k];
                            }
                        }
                    }
                }
            }
            for(int j = 0;j<6;j++){
                for(int k = 1;k<=rollMax[j];k++){
                    res = (res+temp[1][j][k])%mod;
                }
            }
            return res;
        }
    }
}